precision mediump float;

uniform sampler2D uTexture;    // 输入的纹理
uniform vec2 uTexelSize;       // 纹理中单个像素的大小
uniform vec2 uRemoveCenter;    // 移除区域的中心点（归一化坐标）
uniform float uRemoveRadius;   // 移除区域的半径

varying vec2 vTextureCoord;    // 纹理坐标

void main() {
    // 计算当前像素到移除区域中心的距离
    float distanceToCenter = distance(vTextureCoord, uRemoveCenter);

    // 初始化颜色为当前像素颜色
    vec4 color = texture2D(uTexture, vTextureCoord);

    // 判断当前像素是否在需要去除的区域内
    if (distanceToCenter < uRemoveRadius) {
        vec4 blurredColor = vec4(0.0);
        float totalWeight = 0.0;

        // 设置模糊半径范围，且模糊半径不能超过去除区域的半径
        float blurRadius = min(uRemoveRadius - distanceToCenter, 5.0); // 限制模糊半径大小为 5 像素

        // 执行模糊卷积，采样周围像素
        for (float x = -blurRadius; x <= blurRadius; x++) {
            for (float y = -blurRadius; y <= blurRadius; y++) {
                // 获取偏移后的纹理坐标
                vec2 offset = vec2(x, y) * uTexelSize;
                vec4 sample = texture2D(uTexture, vTextureCoord + offset);

                // 给予距离中心近的像素更大的权重
                float weight = 1.0 - (length(vec2(x, y)) / blurRadius);
                blurredColor += sample * weight;
                totalWeight += weight;
            }
        }

        // 平均模糊后的颜色
        blurredColor /= totalWeight;

        // 逐步融合过渡
        float influence = smoothstep(uRemoveRadius * 0.9, uRemoveRadius, distanceToCenter);
        color = mix(blurredColor, color, influence);
    }

    // 输出最终颜色
    gl_FragColor = color;
}
